package com.soul.admin.listener;

import com.alibaba.fastjson.JSON;
import com.soul.admin.service.LogService;
import com.soul.model.db.Log;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Map;

/**
 * @author mdoya
 * @version 1.0
 * @description: log日志rabbitmq的消费者监听器
 */
@Slf4j
@Component
public class LogListener {

    @Autowired
    private LogService logService;

    /**
     *  rabbitmq消息队列 监听生产者消息
     * @param message 字符串对象
     */
    @RabbitListener(
            bindings = @QueueBinding( // 消息队列绑定
                    value = @Queue(value = "soul.log.queue",durable = "true"), // 消息队列名称  durable持久化
                    exchange = @Exchange(value = "soul.log.exchange",type = ExchangeTypes.TOPIC),  // 绑定生产者交换机，交换机类型为主题模式    简单  广播 路由 主题 订阅模式 *匹配一个  #匹配一个或者多个
                    key = {"log.*"} // 绑定key  指定交换机名称 路径可以完全限定或者*或者#
            )
    )
    public void listenerMessage(String message){
        log.debug("开始log日志listener监听");
        // 1. 获取异步消息对象
        Map<String,String> map = JSON.parseObject(message, Map.class);
        String userId = map.get("userId"); // 操作用户id
        String logTime = map.get("logTime"); // 用户操作时间
        String type = map.get("type"); // 用户操作类型
        // 2. 构造参数添加日志
        Log l = new Log();
        l.setUserId(Long.valueOf(userId));
        l.setType(type);
        l.setLogTime(logTime);
        l.setPlace("广东省深圳市"); // 模拟数据  实际前端传过来
        l.setEquipment("华为"); //  模拟数据    实际前端传过来
        // 3. 执行添加日志
        logService.add(l);
        log.debug("结束log日志listener监听");
    }
}
